home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Extensions / Imaging / PIL / MspImagePlugin.py < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.0 KB  |  100 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: MspImagePlugin.py,v 1.1.1.1 1998/08/18 13:07:50 sjoerd Exp $
  4. #
  5. # MSP file handling
  6. #
  7. # This is the format used by the Paint program in Windows 1 and 2.
  8. #
  9. # History:
  10. #    95-09-05 fl    Created
  11. #    97-01-03 fl    Read/write MSP images
  12. #
  13. # Copyright (c) Secret Labs AB 1997.
  14. # Copyright (c) Fredrik Lundh 1995-97.
  15. #
  16. # See the README file for information on usage and redistribution.
  17. #
  18.  
  19.  
  20. __version__ = "0.1"
  21.  
  22. import Image, ImageFile
  23.  
  24.  
  25. #
  26. # read MSP files
  27.  
  28. def i16(c):
  29.     return ord(c[0]) + (ord(c[1])<<8)
  30.  
  31. def _accept(prefix):
  32.     return prefix[:4] in ["DanM", "LinS"]
  33.  
  34. class MspImageFile(ImageFile.ImageFile):
  35.  
  36.     format = "MSP"
  37.     format_description = "Windows Paint"
  38.  
  39.     def _open(self):
  40.  
  41.     # Header
  42.     s = self.fp.read(32)
  43.     if s[:4] not in ["DanM", "LinS"]:
  44.         raise SyntaxError, "not an MSP file"
  45.  
  46.     # Header checksum
  47.     sum = 0
  48.     for i in range(0, 32, 2):
  49.         sum = sum ^ i16(s[i:i+2])
  50.     if sum != 0:
  51.         raise SyntaxError, "bad MSP checksum"
  52.  
  53.     self.mode = "1"
  54.     self.size = i16(s[4:]), i16(s[6:])
  55.  
  56.     if s[:4] == "DanM":
  57.         self.tile = [("raw", (0,0)+self.size, 32, ("1", 0, 1))]
  58.     else:
  59.         self.tile = [("msp", (0,0)+self.size, 32+2*self.size[1], None)]
  60.  
  61. #
  62. # write MSP files (uncompressed only)
  63.  
  64. def o16(i):
  65.     return chr(i&255) + chr(i>>8&255)
  66.  
  67. def _save(im, fp, filename):
  68.  
  69.     if im.mode != "1":
  70.     raise IOError, "cannot write mode %s as MSP" % im.mode
  71.  
  72.     # create MSP header
  73.     header = [0] * 16
  74.  
  75.     header[0], header[1] = i16("Da"), i16("nM") # version 1
  76.     header[2], header[3] = im.size
  77.     header[4], header[5] = 1, 1
  78.     header[6], header[7] = 1, 1
  79.     header[8], header[9] = im.size
  80.  
  81.     sum = 0
  82.     for h in header:
  83.     sum = sum ^ h
  84.     header[12] = sum # FIXME: is this the right field?
  85.  
  86.     # header
  87.     for h in header:
  88.     fp.write(o16(h))
  89.  
  90.     # image body
  91.     ImageFile._save(im, fp, [("raw", (0,0)+im.size, 32, ("1", 0, 1))])
  92.  
  93. #
  94. # registry
  95.  
  96. Image.register_open("MSP", MspImageFile, _accept)
  97. Image.register_save("MSP", _save)
  98.  
  99. Image.register_extension("MSP", ".msp")
  100.